/**
 * async函数的返回值是一个promise对象
 * 返回的promise的结果由函数执行的结果决定
 * @returns {Promise<string>}
 */

async function foo(){
    return 'foo'
}

const f = foo()
console.log(f) // Promise { 'foo' }
f.then(value=>{
    console.log(value) // foo
})



/**
 await表达式
 await右边一般是promise对象，但也可以是其他值
 如果表达式是promise对象，await返回的是promise成功的值
 如果表示式是其他值，直接将此值作为await的值返回

 注意：
 await必须写在async函数中，但async函数中可以没有await
 如果await的promise失败了，就会抛出异常，需要通过try...catch来捕获处理

 */

//await右边是一个普通值
async function foo2(){
    const result =  await 2
    console.log('foo2 result ',result)
}

foo2() // foo2 result  2

//await右边是promise成功的对象,返回的是成功的值
async function foo3(){
    let result =  await Promise.resolve(3)
    console.log('foo3 result ',result)
}

foo3() // foo3 result  3



//await右边是promise失败的对象，需要在try...catch捕获
async function foo4(){
    try{
        const result =  await Promise.resolve(Promise.reject(4))
        console.log('foo4 result ',result) // 如果成功才会执行这里
    }catch(error){
        console.log('foo4 error ',error)
    }
}

foo4() // foo4 error  4


async function foo5(){
    return  await Promise.reject(5)
}

const f5 = foo5()
f5.then(
    value=>{},
    reason=>{
        console.log(reason) // 5
    }
)



